package com.future.allUtils.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import static com.future.allUtils.constants.RedisCacheConstants.*;

/**
 * Token刷新工具类
 */
@Component
public class TokenRefreshUtil {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 检查并刷新Token
     * @param userId 用户ID
     * @param currentToken 当前Token
     * @return 新Token，如果不需要刷新则返回null
     */
    public String checkAndRefreshToken(Long userId, String currentToken) {
        // 获取当前Token的剩余有效期
        Long expire = stringRedisTemplate.getExpire(LOGIN_TOKEN_PREFIX + userId, TimeUnit.SECONDS);

        // 如果剩余时间小于刷新阈值（20分钟），则刷新Token
        if (expire != null && expire < REFRESH_THRESHOLD) {
            return refreshToken(userId, currentToken);
        }

        return null;
    }

    /**
     * 强制刷新Token
     * @param userId 用户ID
     * @param currentToken 当前Token
     * @return 新的Token
     */
    public String refreshToken(Long userId, String currentToken) {
        // 验证当前Token是否有效
        String redisToken = stringRedisTemplate.opsForValue().get(LOGIN_TOKEN_PREFIX + userId);
        if (redisToken == null || !redisToken.equals(currentToken)) {
            return null;
        }

        // 生成新的Token
        String newToken = JwtUtil.createJWT(String.valueOf(userId), JwtUtil.JWT_TTL);

        // 更新Redis中的Token和用户信息过期时间
        stringRedisTemplate.opsForValue().set(
            LOGIN_TOKEN_PREFIX + userId,
            newToken,
            CACHE_NORMAL_TTL,
            TimeUnit.SECONDS
        );

        // 同时更新用户信息的过期时间
        stringRedisTemplate.expire(USER_INFO_PREFIX + userId, CACHE_NORMAL_TTL, TimeUnit.SECONDS);

        return newToken;
    }
}
